Block IO safety patch for live migration. Xend checks that VBDs are destroyed before...
authorjchesterfield@dhcp92.uk.xensource.com <jchesterfield@dhcp92.uk.xensource.com>
Wed, 30 Aug 2006 10:39:27 +0000 (11:39 +0100)
committerjchesterfield@dhcp92.uk.xensource.com <jchesterfield@dhcp92.uk.xensource.com>
Wed, 30 Aug 2006 10:39:27 +0000 (11:39 +0100)
tools/python/xen/xend/XendCheckpoint.py
tools/python/xen/xend/XendDomain.py
tools/python/xen/xend/XendDomainInfo.py

index 6801f3cd40d6c19a48c73283176d86d05a0cb191..9fd3169a9d838c3cd2372d6531d1103448e63b7d 100644 (file)
@@ -161,10 +161,12 @@ def restore(xd, fd):
         if handler.store_mfn is None or handler.console_mfn is None:
             raise XendError('Could not read store/console MFN')
 
+       #Block until src closes connection
+       os.read(fd, 1)
         dominfo.unpause()
-
+        
         dominfo.completeRestore(handler.store_mfn, handler.console_mfn)
-
+        
         return dominfo
     except:
         dominfo.destroy()
index bbdfd62ab98635935b9cd02820b27e442a8bdba9..af4c474b9411b96aaec3b23a5069ef7ef58482fd 100644 (file)
@@ -431,7 +431,8 @@ class XendDomain:
         sock.send("receive\n")
         sock.recv(80)
         XendCheckpoint.save(sock.fileno(), dominfo, True, live, dst)
-
+       dominfo.testDeviceComplete()
+       sock.close()
 
     def domain_save(self, domid, dst):
         """Start saving a domain to file.
index a7a388bbea20350fbb846d4eef13e495177a4357..48ff0ff2911d1fc14fbf759f88090cb599f5cc4d 100644 (file)
@@ -1494,6 +1494,21 @@ class XendDomainInfo:
             if rc != 0:
                 raise XendError("Device of type '%s' refuses migration." % n)
 
+    def testDeviceComplete(self):
+        """ For Block IO migration safety we must ensure that
+        the device has shutdown correctly, i.e. all blocks are
+        flushed to disk
+        """
+        while True:
+            test = 0
+            for i in self.getDeviceController('vbd').deviceIDs():
+                test = 1
+                log.info("Dev %s still active, looping...", i)
+                time.sleep(0.1)
+                
+            if test == 0:
+                break
+
     def migrateDevices(self, network, dst, step, domName=''):
         """Notify the devices about migration
         """